﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Management;
using System.Collections;
// namespaces necesarios para conexión a bd
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;

namespace clonegame
{
    public partial class formularioReporteEditar : UserControl
    {
        private static readonly formularioReporteEditar instancia = new formularioReporteEditar();

        public static formularioReporteEditar Instancia
        {
            get
            { return instancia; }
        }

        // Cadena de conexión.
        private string cadCon;
        private SqlDataAdapter da;
        private SqlDataAdapter daa;
        private SqlDataAdapter daaa;
        private SqlConnection c;
        private DataSet vdb;

        private ENReporte reporte;
        public ENReporte Re
        {
            get { return reporte; }
            set { reporte = value; }
        }

        /// <summary>
        /// Constructor.
        /// </summary>
        public formularioReporteEditar()
        {
            InitializeComponent();
            dtpFecha.Enabled = false;

            try
            {
                // Establecemos la cadena de conexión desde app.config.
                cadCon = ConfigurationManager.ConnectionStrings["conexion"].ConnectionString;

                // Creamos la base de datos virtual.
                vdb = new DataSet();

                // Obtenemos una conexión.
                c = new SqlConnection(cadCon);

                // Almacenamos la base de datos en local.
                da = new SqlDataAdapter("select * from reporte", c);
                da.Fill(vdb, "Reporte");

                daa = new SqlDataAdapter("select * from usuarios", c);
                daa.Fill(vdb, "Usuario");

                daaa = new SqlDataAdapter("select * from escuadron", c);
                daaa.Fill(vdb, "Escuadron");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// Muestra formulario buscar.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void btBusqueda_Click(object sender, EventArgs e)
        {
            formularioReportes form = formularioReportes.Instancia;

            form.MuestraForm(formularioReporteBuscar.Instancia);
        }

        /// <summary>
        /// Carga los datos de reporte en el formulario.
        /// </summary>
        /// <param name="fecha">Fecha reporte.</param>
        /// <param name="atacante">Escuadron atacante.</param>
        /// <param name="defensor">Usuario defensor.</param>
        /// <param name="ganador">Usuario ganador.</param>
        /// <param name="descripcion">Descripcion reporte batalla.</param>
        public void cargarDatos(string fecha, string atacante, string defensor, string ganador, string ataqueA, string defensaA, string ataqueD, string defensaD, string descripcion)
        {
            dtpFecha.Value = new DateTime(Int32.Parse(fecha.Split(' ')[0].Split('/')[2]), Int32.Parse(fecha.Split(' ')[0].Split('/')[1]), Int32.Parse(fecha.Split(' ')[0].Split('/')[0]), Int32.Parse(fecha.Split(' ')[1].Split(':')[0]), Int32.Parse(fecha.Split(' ')[1].Split(':')[1]), Int32.Parse(fecha.Split(' ')[1].Split(':')[2]));
            tbAtacante.Text = atacante;
            tbDefensor.Text = defensor;
            tbGanador.Text = ganador;
            tbAtaqueA.Text = ataqueA;
            tbDefensaA.Text = defensaA;
            tbAtaqueD.Text = ataqueD;
            tbDefensaD.Text = defensaD;
            tbDescripcion.Text = descripcion;

            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));
        }

        /// <summary>
        /// Borra formulario.
        /// </summary>
        public void BorraForm()
        {
            dtpFecha.Value = DateTime.Now;
            tbAtacante.Text = "";
            tbDefensor.Text = "";
            tbGanador.Text = "";
            tbAtaqueA.Text = "";
            tbDefensaA.Text = "";
            tbAtaqueD.Text = "";
            tbDefensaD.Text = "";
            tbDescripcion.Text = "";
            dtpFecha.Enabled = true;
        }

        /// <summary>
        /// Guarda reporte en base de datos.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void btGuardar_Click(object sender, EventArgs e)
        {
            ENReporte reporte = new ENReporte();
            ENActividad act = new ENActividad();

            DataRow r, rr;
            DataTable te = new DataTable();
            te = vdb.Tables["Escuadron"];
            DataTable tu = new DataTable();
            tu = vdb.Tables["Usuario"];

            // Relleno los datos de la reporte.

            try
            {
                reporte.Fecha = dtpFecha.Value.ToString();

                r = tu.Select("cuenta = \'" + tbAtacante.Text + "\'")[0];
                rr = te.Select("usuario = \'" + r["id"] + "\'")[0];

                reporte.Atacante = Int32.Parse(rr["id"].ToString().Trim());

                r = tu.Select("cuenta = \'" + tbDefensor.Text + "\'")[0];

                reporte.Defensor = Int32.Parse(r["id"].ToString().Trim());

                r = tu.Select("cuenta = \'" + tbGanador.Text + "\'")[0];

                reporte.Ganador = Int32.Parse(r["id"].ToString().Trim());

                reporte.AtaqueA = Int32.Parse(tbAtaqueA.Text);
                reporte.DefensaA = Int32.Parse(tbDefensaA.Text);
                reporte.AtaqueD = Int32.Parse(tbAtaqueD.Text);
                reporte.DefensaD = Int32.Parse(tbDefensaD.Text);

                reporte.Texto = tbDescripcion.Text;

                if (CADReporte.Instancia.InsertarReporte(reporte))
                {
                    MessageBox.Show("Reporte creado correctamente", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    // Insertamos la actividad.

                    act.Accion = "Alta";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha dado de alta un nuevo reporte.";
                    act.Fecha = DateTime.Now.ToString();
                    CADActividad.Instancia.InsertarActividad(act);
                }
                else
                {
                    act.Accion = "Modificación";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha modificado el reporte con fecha " + dtpFecha.Value.ToString() + ".";
                    act.Fecha = DateTime.Now.ToString();

                    CADActividad.Instancia.InsertarActividad(act);
                }

                formularioReportes form = formularioReportes.Instancia;

                form.RellenaDGV(false, form.Pagina, form.RowsPaginas);

                // Actualizamos el DGV de bienvenida.
                formularioBienvenida.Instancia.actualizaResumen();

                dtpFecha.Enabled = false;
            }

            catch
            {
                MessageBox.Show("Datos incorrectos, Vuelva a introducirlos.", "Datos Incorrectos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        /// <summary>
        /// Restaura informacion reporte.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void Restaurar_Click(object sender, EventArgs e)
        {
            try
            {
                ENReporte re = CADReporte.Instancia.getReporte(dtpFecha.Value.ToString());

                cargarDatos(re.Fecha.ToString(), re.NAtacante.ToString(), re.NDefensor.ToString(), re.NGanador.ToString(), re.AtaqueA.ToString(), re.DefensaA.ToString(), re.AtaqueD.ToString(), re.DefensaD.ToString(), re.Texto.ToString());
            }

            catch
            {

            }
        }

        /// <summary>
        /// Vuelve a generar simulacion batalla y posterior reporte.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void btGenerar_Click(object sender, EventArgs e)
        {
            int num;
            bool termina = false;
            bool ganas = false;
            Random r = new Random(DateTime.Now.Millisecond);

            try
            {
                // Borra Reporte
                tbDescripcion.Text = "";

                // Simulacion Batalla
                while (!termina)
                {
                    // Ataca Defensor
                    tbDescripcion.Text += "TU RIVAL ATACA! /\r\n";
                    tbDescripcion.Text += tbAtaqueD.Text + " Ataque VS " + tbDefensaA.Text + " Defensa /\r\n";
                    tbDescripcion.Text += "Probabilidad Exito Ataque: " + (int)(((Double.Parse(tbAtaqueD.Text)) / (Double.Parse(tbAtaqueD.Text) + Double.Parse(tbDefensaA.Text)))*100) + "% //\r\n\r\n";
                    num = r.Next(Int32.Parse(tbAtaqueD.Text) + Int32.Parse(tbDefensaA.Text));

                    // Gana Defensor
                    if (num < Int32.Parse(tbAtaqueD.Text))
                    {
                        tbGanador.Text = tbDefensor.Text;
                        tbDescripcion.Text += "PIERDES!, Tus Unidades Han Sido Destruidas! //\r\n\r\n";
                        termina = true;
                    }
                    // Pierde Defensor
                    else
                    {
                        tbDescripcion.Text += "GANAS!, Tus Unidades Esquivan el Ataque! //\r\n\r\n";

                        // Ataca Atacante
                        tbDescripcion.Text += "TU ATACAS! /\r\n";
                        tbDescripcion.Text += tbAtaqueA.Text + " Ataque VS " + tbDefensaD.Text + " Defensa /\r\n";
                        tbDescripcion.Text += "Probabilidad Exito Ataque: " + (int)(((Double.Parse(tbAtaqueA.Text)) / ((Double.Parse(tbAtaqueA.Text) + Double.Parse(tbDefensaD.Text)))) * 100) + "% //\r\n\r\n";
                        num = r.Next(Int32.Parse(tbAtaqueA.Text) + Int32.Parse(tbDefensaD.Text));

                        // Gana Atacante
                        if (num < Int32.Parse(tbAtaqueA.Text))
                        {
                            tbGanador.Text = tbAtacante.Text;
                            tbDescripcion.Text += "GANAS!, Tus Unidades Ganan la Batalla! //\r\n\r\n";
                            termina = true;
                            ganas = true;
                        }
                        else
                        {
                            tbDescripcion.Text += "PIERDES!, Las Unidades Rivales Esquivan Tu Ataque! //\r\n\r\n";
                        }
                    }
                }

                tbDescripcion.Text += "Mensaje del Frente: /\r\n";
                tbDescripcion.Text += "------------------------- /\r\n";

                num = r.Next(5);

                // Mensajes Ganadores
                if (ganas)
                {
                    switch (num)
                    {
                        case 0:
                            tbDescripcion.Text += "Señor, nuestras unidades han salido triunfantes de la batalla!. /\r\nHa sido una batalla sin tregua pero finalmente nuestros efectivos pudieron con las unidades antiaereas enemigas.";
                            break;

                        case 1:
                            tbDescripcion.Text += "Señor, nuestras unidades han arrasado. Nuestra fuerza de ataque era tremendamente superior!. /\r\nHa sido demasiado fácil!. Estaban totalmente desconcertados y nos aprovechamos de ello.";
                            break;

                        case 2:
                            tbDescripcion.Text += "Señor, hemos masacrado a nuestro enemigo!. /\n\rLas debiles defensas del rival no han sido suficientes para parar a nuestras unidades!.";
                            break;

                        case 3:
                            tbDescripcion.Text += "Señor, el combate ha sido duro pero salimos victoriosos!. /\n\rLas unidades enemigas opusierón una feroz resistencia pero finalmente fueron reducidas.";
                            break;

                        case 4:
                            tbDescripcion.Text += "Señor, nuestra flota gano sin problemas en territorio enemigo. /\n\rEl enemigo no opuso mayor resistencia, fuímos tremendamente superiores.";
                            break;
                    }
                }
                // Mensajes Perdedores
                else
                {
                    switch (num)
                    {
                        case 0:
                            tbDescripcion.Text += "Señor, la suerte se ha aliado con el enemigo. /\r\nNo pudimos hacer nada contra las fuertes defensas enemigas.";
                            break;

                        case 1:
                            tbDescripcion.Text += "Señor, la batalla ha sido un infierno!. /\r\nTodas las unidades han sido destruidas!. Nos atacarón ha traición!.";
                            break;

                        case 2:
                            tbDescripcion.Text += "Señor, el combate ha sido un autentico fracaso!. /\r\nNuestro enemigo ha sido más listo que nosotros, sus defensas estaban estratégicamente colocadas.";
                            break;

                        case 3:
                            tbDescripcion.Text += "Señor, nuestros rivales han sido muy superiores en el campo de batalla. /\n\rPudimos aguantar un tiempo pero finalmente ocurrió lo inevitable.";
                            break;

                        case 4:
                            tbDescripcion.Text += "Señor, nuestra flota atacante no pudo con las defensas enemigas!. /\n\rEl enemigo nos tendió una emboscada, no tuvimos ninguna oportunidad!.";
                            break;
                    }
                }
            }

            catch
            {
                tbDescripcion.Text = "";
                MessageBox.Show("Datos incorrectos, Vuelva a introducirlos.", "Datos Incorrectos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
    }
}
